#include<iostream>
using namespace std;
const int N = 1e7 + 10;
int tr[N][2];//想象一下对于第一个位置来说有n个串，每个串的占位cur又不重复，所以空间其实得给到1e5*32
//写N*32就行了。我偷懒直接把N给到1e7
int a[N];
int idx;
void insert(int x)
{
	//在32位系统下int32位
	int cur = 0;
	for (int k = 31;k >= 0;k--)
	{
		int y = (x >> k) & 1;
		if (tr[cur][y] == 0) tr[cur][y] = ++idx;
		cur=tr[cur][y];
		//存储信息
	}
}
int find(int x)
{
	int ret = 0;
	int cur = 0;
	for (int k = 31;k >= 0;k--)
	{
		int y = (x >> k) & 1;
		if (tr[cur][y ^ 1])//如果与这个串相反位存在的话那就去这一位
		{
			//如果取这一位的话那最后结果这一位绝对是一，直接异或就行了
			ret |= (1 << k);//注意这里是|=因为我们得保证更改完之后这一位是1.
			cur = tr[cur][y^1];//注意，因为我们是从最左边的位进行的操作，最左边的为权重都更高
			//所以第一个能找到的1是占得权重最大的
			//因为我们要保证是两个字符串进行异或操作，所以如果找到1了那就得在新串上继续找。
			//另外一点就是这个存储结构和画出来的图是不一样的。每个串的cur都是独一无二的。
			//当我们遇到分叉的地方，这个右分叉的存储的位置实际是左分叉的最下面的位置的下面。
		}
		else
		{
			cur = tr[cur][y];
		}
	}
	return ret;
}
int main()
{
	int n;
	cin >> n;
	for (int i = 1;i <= n;i++)
	{
		cin >> a[i];
		insert(a[i]);
	}
	int ret1=0;
	for (int i = 1;i <= n;i++)
	{
		ret1 = max(ret1, find(a[i]));
	}
	cout << ret1;
	return 0;
}